package co.gov.medellin.ssti.sub.web.action;

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.beans.factory.annotation.Autowired;

import co.gov.medellin.ssti.sub.common.excepcion.SUBException;
import co.gov.medellin.ssti.sub.common.util.Utility;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.service.AreaService;
import co.gov.medellin.ssti.sub.model.service.AtributosService;
import co.gov.medellin.ssti.sub.model.service.ProgramaService;
import co.gov.medellin.ssti.sub.model.service.RepBeneficioOtorgadoService;
import co.gov.medellin.ssti.sub.model.service.SedeService;
import co.gov.medellin.ssti.sub.model.service.SubprogramaService;
import co.gov.medellin.ssti.sub.model.vo.AreaVO;
import co.gov.medellin.ssti.sub.model.vo.AtributoVO;
import co.gov.medellin.ssti.sub.model.vo.ProgramaVO;
import co.gov.medellin.ssti.sub.model.vo.RepBeneficioOtorgadoVO;
import co.gov.medellin.ssti.sub.model.vo.SedeVO;
import co.gov.medellin.ssti.sub.model.vo.SubprogramaVO;
import co.gov.medellin.ssti.sub.paoyer.administration.model.vo.UserVO;

public class ReportDetEnteGestorAction extends Action {
	@Autowired
	AreaService areaServiceImpl;
	@Autowired
	AtributosService atributosServiceImpl;
	@Autowired
	ProgramaService programaServiceImpl;
	@Autowired
	RepBeneficioOtorgadoService repBeneficioOtorgadoServiceImpl;
	@Autowired
	SedeService sedeServiceImpl;
	@Autowired
	SubprogramaService subprogramaServiceImpl;

	/**
	 * This is the main action called from the Struts framework.
	 * 
	 * @param mapping
	 *            The ActionMapping used to select this instance.
	 * @param form
	 *            The optional ActionForm bean for this request.
	 * @param request
	 *            The HTTP Request we are processing.
	 * @param response
	 *            The HTTP Response we are processing.
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {

		HttpSession session = request.getSession();
		UserVO user = (UserVO) session.getAttribute("userInfo");
		StringBuffer msg = new StringBuffer("");

		if (session.getAttribute("BeneficiosOtorgado") != null) {
			session.removeAttribute("BeneficiosOtorgado");
		}

		Collection<SedeVO> sedes = null;
		try {
			sedes = sedeServiceImpl.loadAllSedes();
		} catch (DAOException e) {
			SUBException.logDebugError("", e);
		}

		if (sedes != null && sedes.size() > 0) {
			request.setAttribute("sedes", (Object) sedes);
		} else {
			request.setAttribute("msgSedes",
					"No se encontraron sedes vigentes a la fecha.");
		}

		Collection<AreaVO> areas = null;
		try {
			areas = areaServiceImpl.findAreasAuthorizedWithGestor(
					String.valueOf(user.getCode()), user.getUserGroupName());
		} catch (DAOException e) {
			SUBException.logDebugError("", e);
		}

		if (areas != null && areas.size() > 0) {
			request.setAttribute("areas", (Object) areas);
		} else {
			request.setAttribute("msgAreas", "No se encontraron areas.\n");
		}

		Collection<ProgramaVO> programas = null;
		String codeArea = request.getParameter("codearea");
		if (codeArea != null && !codeArea.equals("nulo")
				&& !codeArea.equals("")) {
			try {
				ProgramaVO objProgramaVO = new ProgramaVO();
				objProgramaVO.setCodeArea(new Long(codeArea));
				programas = programaServiceImpl
						.findProgramaByCriteriaWithGestor(objProgramaVO,
								user.getUserGroupName(), user.getCode(),
								user.getCodeArea());
			} catch (DAOException e) {
				SUBException.logDebugError("", e);
			}
		} else {
			try {
				programas = repBeneficioOtorgadoServiceImpl
						.findProgramaWithGestorByUserReport(user.getCode(),
								user.getUserGroupName(), user.getCodeArea());
			} catch (DAOException e) {
				SUBException.logDebugError("", e);
			}
		}

		if (programas != null && programas.size() > 0) {
			request.setAttribute("programas", (Object) programas);
		} else {
			request.setAttribute("msgProgramas",
					"No se encontraron programas vigentes a la fecha.\n");
		}

		String codePrograma = request.getParameter("codePrograma");
		if (codePrograma != null && !codePrograma.equals("nulo")
				&& !codePrograma.equals("")) {
			Collection<SubprogramaVO> subprogramas = null;

			try {
				SubprogramaVO vo = new SubprogramaVO();
				vo.setCode(Long.valueOf(codePrograma));
				subprogramas = subprogramaServiceImpl
						.findAllowedSubprogramaWithGestorByCriteria(vo,
								user.getCode(), user.getUserGroupName(),
								user.getCodeArea());
				// subprogramas = repBeneficioOtorgadoServiceImpl
				// .findSubProgramaWithGestorByUserReport(user.getCode(),
				// user.getUserGroupName(), codePrograma,
				// user.getCodeArea());
			} catch (DAOException e) {
				SUBException.logDebugError("", e);
			}

			if (subprogramas != null && subprogramas.size() > 0) {
				request.setAttribute("subprogramas", (Object) subprogramas);
			} else {
				request.setAttribute(
						"msgSubprogramas",
						"No se encontraron subprogramas asociados a este programa que esten vigentes.\n");
			}
		}

		String accion = (request.getParameter("accion") == null) ? "" : request
				.getParameter("accion");
		if (accion != null && accion.length() > 0) {
			if (accion.equals("BuscarSiTieneAtributo")) {
				AtributoVO atributoVO = null;
				try {
					String codeSub = request.getParameter("codeSubPrograma");

					if (codeSub != null && !codeSub.equals("nulo")) {
						atributoVO = new AtributoVO();
						atributoVO = atributosServiceImpl
								.findAtributoByCodigo(new Long(codeSub));
					}

					if (atributoVO != null) {
						session.setAttribute("Gestor",
								(Object) atributoVO.getValoresflexibles());
						session.setAttribute("codigoAtr",
								atributoVO.getCodigo());
						// System.out.println("codigoAtr: " +
						// atributoVO.getCodigo());
					} else {
						session.removeAttribute("Gestor");
						session.removeAttribute("codigovfl");
						session.removeAttribute("codigoAtrGestor");
					}

				} catch (DAOException e) {
					SUBException.logDebugError("", e);
				}

			} else if (accion.equals("BuscarTodo")) {
				boolean continuar = true;

				// fecha inicial
				String fechaini = (request.getParameter("fechaInicial") == null) ? ""
						: request.getParameter("fechaInicial");
				String fechafinal = (request.getParameter("fechaFinal") == null) ? ""
						: request.getParameter("fechaFinal");

				// validar fechas.
				if (!fechaini.equals("") && !fechafinal.equals("")) {
					if (!Utility.isDateValid(fechaini)) {
						request.setAttribute("errorfecha",
								"La fecha inicial es incorrecta");
						continuar = false;
					} else if (!Utility.isDateValid(fechafinal)) {
						request.setAttribute("errorfecha",
								"La fecha final es incorrecta");
						continuar = false;
					} else {
						Date fIni;
						Date fFin;
						try {
							fIni = new SimpleDateFormat(Utility.DATE_FORMAT)
									.parse(fechaini);
							fFin = new SimpleDateFormat(Utility.DATE_FORMAT)
									.parse(fechafinal);
							if (fIni.after(fFin)) {
								request.setAttribute("errorfecha",
										"La fecha inicial es mayor a la final");
								continuar = false;
							}
						} catch (ParseException e) {
							continuar = false;
						}
					}
				}

				if (continuar) {
					session.removeAttribute("beneficiosSede");

					Collection<RepBeneficioOtorgadoVO> beneficioOtorgado = null;
					try {
						RepBeneficioOtorgadoVO objBeneOtorVO = new RepBeneficioOtorgadoVO();

						String codeSede = request.getParameter("code");
						if (codeSede != null && !codeSede.equals("nulo")) {
							objBeneOtorVO.setCodeSede(new Long(codeSede));
						}

						if (codePrograma != null
								&& !codePrograma.equals("nulo")) {
							objBeneOtorVO
									.setCodePrograma(new Long(codePrograma));
						}

						String codeSubprograma = request
								.getParameter("codeSubPrograma");
						if (codeSubprograma != null
								&& !codeSubprograma.equals("nulo")) {
							objBeneOtorVO.setCodeSubprograma(new Long(
									codeSubprograma));

							String codigovfl = request
									.getParameter("codigovfl");
							if (codigovfl != null) {
								AtributoVO atributoVO = atributosServiceImpl
										.findAtributoByCodigo(new Long(
												codeSubprograma));

								if (atributoVO != null) {
									session.setAttribute("Gestor",
											(Object) (atributoVO
													.getValoresflexibles()));
									if (!codigovfl.equals("nulo")) {
										session.setAttribute("codigovfl",
												codigovfl);
										session.setAttribute("codigoAtrGestor",
												atributoVO.getCodigo());
										objBeneOtorVO.setGestor(codigovfl);
										objBeneOtorVO
												.setCodigoAtrGestor(atributoVO
														.getCodigo());
									} else {
										session.removeAttribute("codigovfl");
									}
								} else {
									session.removeAttribute("Gestor");
									session.removeAttribute("codigovfl");
									session.removeAttribute("codigoAtrGestor");
								}
							}
						}

						if (!fechaini.equals("")) {

							objBeneOtorVO.setDesde(fechaini);
						}
						if (!fechafinal.equals("")) {
							objBeneOtorVO.setHasta(fechafinal);

						}

						beneficioOtorgado = repBeneficioOtorgadoServiceImpl
								.findBeneficioOtorgadoConGestorByCriteria(objBeneOtorVO);
						if (beneficioOtorgado != null
								&& beneficioOtorgado.size() > 0) {
							session.setAttribute("BeneficiosOtorgado",
									(Object) beneficioOtorgado);
						} else {
							msg.append("No hay registros que cumplan con los criterios seleccionados.\n");
						}
						objBeneOtorVO = null;
					} catch (DAOException e) {
						msg.append("Se registro un error durante la consulta.\n");
						SUBException.logDebugError("", e);
					}
				}
			}
		}

		if (msg.length() > 0)
			request.setAttribute("msg", msg.toString());

		return mapping.findForward("success");
	}
}
